<?php



class ServiceController extends Controller
{

	public function filters()
    {
        return array('accessControl');
    }
	
	public function accessRules()
    {   	    	
				
        return array(
            array('allow',
                'actions'=>array('login'),                
            ),
             array('allow',
                'actions'=>array('logout','shop'),                
            ),
            array('allow', // allow authenticated users to access all actions
                'users'=>array('@'),
            ),            
            array('deny'),
        );
    }
    /**
     * Declares class-based actions.
     */
    public function actions()
    {
        return array(
            // captcha action renders the CAPTCHA image displayed on the contact page
           /* 'captcha' => array(
                'class' => 'CCaptchaAction',
                'backColor' => 0xFFFFFF,
            ),
           */
            // page action renders "static" pages stored under 'protected/views/site/pages'
            // They can be accessed via: index.php?r=site/page&view=FileName
            'page' => array(
                'class' => 'CViewAction',
            ),
        );
    }

	// Members
    /**
     * Key which has to be in HTTP USERNAME and PASSWORD headers 
     */
    Const APPLICATION_ID = 'ASCCPE';
 
    /**
     * Default response format
     * either 'json' or 'xml'
     */
    private $format = 'json';
    /**
     * @return array action filters
     */
    
 
    // Actions
    public function actionList()
    {
        $accountId = UserInformation::getAccountId();
		$locationId =  UserInformation::getLocationId();
        $userId= UserInformation::getUserId();
		$ezApi = new EzRestApi();
		
		$page = 0;
		$size = 20;
		$keyword ="";
		$fromDate = null;
		$toDate = null;
                
                if (isset($_GET['id']))
		{
			$id = $_GET['id'];
		}
		if (isset($_GET['page']))
		{
			$page = $_GET['page'];
		}
		if (isset($_GET['size']))
		{
			$size = $_GET['size'];
		}
		if (isset($_GET['keyword']))
		{
			$keyword = $_GET['keyword'];
		} 
		if (isset($_GET['from']))
		{
			$fromDate = $_GET['from'];
		} 
		if (isset($_GET['to']))
		{
			$toDate = $_GET['to'];
		} 
		
    	switch($_GET['model'])
	    {
	    	case 'product':
                    
	    		$models = $ezApi->searchProduct($accountId, $locationId, $keyword,$page,$size);
	            break;
			case 'productCategory':
	    		$models = $ezApi->getProductCategories($accountId, $locationId);
	            break;		 
			case 'customer':				
				$models = $ezApi->searchCustomer($accountId, $locationId, $keyword,$page,$size);
	            break;	
			case 'customerCategory':				
				$models = $ezApi->getCustomerCategories($accountId, $locationId);
	            break;	
			case 'invoice':	
	            $models = $ezApi->searchInvoice($accountId, $locationId, $keyword,$fromDate, $toDate, $page,$size);
	            break;	
			case 'order':				
				$models = $ezApi->searchOrder($accountId, $locationId, $keyword,$fromDate, $toDate, $page,$size);
	            break;	
			case 'summary':				
				$models = $ezApi->getSummary($accountId, $locationId,$fromDate,$toDate);
	            break; 
                        case 'shop':				
				$models = $ezApi->getLstshop($accountId, $userId);
                                //$models = $ezApi->getSummary($accountId, $locationId,$fromDate,$toDate);
                                //$model="leduykhanh";
	            break;
			case 'summaryWeekChart':
				$lastMonday = strtotime('-7 days');
				$dtStr = date("c", $lastMonday);
				$date = new DateTime($dtStr);
				$today = new DateTime();
				$refDate = new DateTime($dtStr);
				$dateArray = array();
                                date_add($date,date_interval_create_from_date_string("1 days"));
				$dateArray[0]= date_format($date,"d-m");				
				date_add($date,date_interval_create_from_date_string("1 days"));
				$dateArray[1]= date_format($date,"d-m");
				date_add($date,date_interval_create_from_date_string("1 days"));
				$dateArray[2]= date_format($date,"d-m");
				date_add($date,date_interval_create_from_date_string("1 days"));
				$dateArray[3]= date_format($date,"d-m");
				date_add($date,date_interval_create_from_date_string("1 days"));
				$dateArray[4]= date_format($date,"d-m");
				date_add($date,date_interval_create_from_date_string("1 days"));
				$dateArray[5]= date_format($date,"d-m");
				date_add($date,date_interval_create_from_date_string("1 days"));
				$dateArray[6]= date_format($date,"d-m");
				
				$arrayValues = array(0=>"0", 1=>"0", 2=>"0", 3=>"0", 4=>"0", 5=>"0", 6=>"0");
				$summaries=$ezApi->getSummaryPurchase($accountId, $locationId);
				
					reset($summaries);
					while(list(,$value)=each($summaries)) {
						$invoiceDate = new DateTime($value['invoiceDate']);
						$interval = date_diff($invoiceDate, $refDate)->d;
						$arrayValues[$interval] = $value['amount'];												
					}
					
					
				$models = array();
				
				$numberOfDayFromWeekBegin = date_diff($today, $refDate)->d;
				$i = 0;
				while ($i <= 6)
				{
					if ($i > $numberOfDayFromWeekBegin)
					{
						$models[$i] = array ('date'=>$dateArray[$i],'amount'=>null );
					}
					else {
						$models[$i] = array ('date'=>$dateArray[$i],'amount'=>$arrayValues[$i]);
					}
					
					
					$i = $i + 1;
				}
				
				$this->_sendResponse(200, json_encode($models));
				//$models = json_encode($models);
				//var_dump($models);
				return;
				break;    
	        default:
	            // Model not implemented error
	            $this->_sendResponse(501, sprintf(
	                'Error: Mode <b>list</b> is not implemented for model <b>%s</b>',
	                $_GET['model']) );
	            Yii::app()->end();
	    }
	    // Did we get some results?
	   	if(is_null($models)) {
	        // No
	        $this->_sendResponse(200, 
	                sprintf('No items where found for model <b>%s</b>', $_GET['model']) );
	    } else {
	        // Prepare response
	        //$rows = array();
	        //foreach($models as $model)
	         //   $rows[] = $model->attributes;
	        // Send the response
	        $this->_sendResponse(200, CJSON::encode($models));
	    }
    }

	public function actionDelete()
	{
	    switch($_GET['model'])
	    {
	        // Load the respective model
	        case 'contact':
				$contactId = $_GET['id'];
				$ezApi = new EzRestApi();
	            $model = $ezApi->deleteCustomerContact($this -> getAccountId(), $this -> getLocationId(), $contactId);                   
	            break;
	        default:
	            $this->_sendResponse(501, 
	                sprintf('Error: Mode <b>delete</b> is not implemented for model <b>%s</b>',
	                $_GET['model']) );
	            Yii::app()->end();
	    }
	    // Was a model found? If not, raise an error
	    if($model === null)
	        $this->_sendResponse(400, 
	                sprintf("Error: error deleting model <b>%s</b> with ID <b>%s</b>.",
	                $_GET['model'], $_GET['id']) );
	 
	    $this->_sendResponse(200, $model); 
	}

	public function actionView()
	{
	    // Check if id was submitted via GET
	    if(!isset($_GET['id']))
	        $this->_sendResponse(500, 'Error: Parameter <b>id</b> is missing' );
	 
	    switch($_GET['model'])
	    {
	        // Find respective model    
	        case 'invoice':
				$id = $_GET['id'];
				$accountId = UserInformation::getAccountId();
				$locationId = UserInformation::getLocationId();
				$ezApi = new EzRestApi();
	            //$model = $ezApi->getInvoiceResponse($accountId, $locationId, $id); 
				$model = $ezApi->getInvoice($accountId, $locationId, $id);
	            break;
                   
			case 'order':
				$id = $_GET['id'];
				$accountId = UserInformation::getAccountId();
				$locationId = UserInformation::getLocationId();
				$ezApi = new EzRestApi();
	            //$model = $ezApi->getInvoiceResponse($accountId, $locationId, $id); 
				$model = $ezApi->getOrder($accountId, $locationId, $id);
	            break;	
			case 'product':
				$id = $_GET['id'];
				$accountId = UserInformation::getAccountId();
				$locationId = UserInformation::getLocationId();
				$ezApi = new EzRestApi();
	            //$model = $ezApi->getProductResponse($accountId, $locationId, $id); 
	            $model = $ezApi->getProduct($accountId, $locationId, $id);
	            break;
			case 'customer':
				$id = $_GET['id'];
				$accountId = UserInformation::getAccountId();
				$locationId = UserInformation::getLocationId();
				$ezApi = new EzRestApi();
	            //$model = $ezApi->getCustomerResponse($accountId, $locationId, $id); 
				$model = $ezApi->getCustomer($accountId, $locationId, $id);
	            break;
	        default:
	            $this->_sendResponse(501, sprintf(
	                'Mode <b>view</b> is not implemented for model <b>%s</b>',
	                $_GET['model']) );
	            Yii::app()->end();
	    }
	    // Did we find the requested model? If not, raise an error
	    if(is_null($model))
	        $this->_sendResponse(404, 'No Item found with id '.$_GET['id']);
	    else
	        $this->_sendResponse(200, CJSON::encode($model));
			//$this->_sendResponse(200, $model);
	}
    
	
	public function actionCreate()
	{
	    switch($_GET['model'])
	    {
	        // Get an instance of the respective model
	        case 'posts':
	            $model = new Post;                    
	            break;
	        default:
	            $this->_sendResponse(501, 
	                sprintf('Mode <b>create</b> is not implemented for model <b>%s</b>',
	                $_GET['model']) );
	                Yii::app()->end();
	    }
	    // Try to assign POST values to attributes
	    foreach($_POST as $var=>$value) {
	        // Does the model have this attribute? If not raise an error
	        if($model->hasAttribute($var))
	            $model->$var = $value;
	        else
	            $this->_sendResponse(500, 
	                sprintf('Parameter <b>%s</b> is not allowed for model <b>%s</b>', $var,
	                $_GET['model']) );
	    }
	    // Try to save the model
	    if($model->save())
	        $this->_sendResponse(200, CJSON::encode($model));
	    else {
	        // Errors occurred
	        $msg = "<h1>Error</h1>";
	        $msg .= sprintf("Couldn't create model <b>%s</b>", $_GET['model']);
	        $msg .= "<ul>";
	        foreach($model->errors as $attribute=>$attr_errors) {
	            $msg .= "<li>Attribute: $attribute</li>";
	            $msg .= "<ul>";
	            foreach($attr_errors as $attr_error)
	                $msg .= "<li>$attr_error</li>";
	            $msg .= "</ul>";
	        }
	        $msg .= "</ul>";
	        $this->_sendResponse(500, $msg );
	    }
	}

        
        public function actionProduct(){
            //echo "test upload";
            $json = file_get_contents('php://input'); //$GLOBALS['HTTP_RAW_POST_DATA'] is not preferred: http://www.php.net/manual/en/ini.core.php#ini.always-populate-raw-post-data
	    $put_vars = CJSON::decode($json,true);  //true means use associative array
	    
	    $accountId = UserInformation::getAccountId();
            $locationId = UserInformation::getLocationId();				
							
            $ezApi = new EzRestApi();
				
            Yii::log($json);
            
            $product = $put_vars;	
            
            //echo $_GET['model'];
            if($product["Status"]=="0"){
                
                //update image
                $model = $ezApi->saveImageProduct($accountId, $locationId, $product['ProductId'],$product["Image"]);
	            $this->_sendResponse(200, CJSON::encode($model));    
                //echo "Test update image";
            }else{
                //delete image
                $model = $ezApi->deleteImageProduct($accountId, $locationId, $product['ProductId']);
	            $this->_sendResponse(200, CJSON::encode($model));    
                //echo "Test delete image";
            }
            
            //echo $product["Status"];
            //echo $product["Image"];
            //$model = $ezApi->saveImageProduct($accountId, $locationId, $product['ProductId'],$product['Image']);
            //$this->_sendResponse(200, CJSON::encode($model)); 
        }
	public function actionUpdate()
	{	
	    // Parse the PUT parameters. This didn't work: parse_str(file_get_contents('php://input'), $put_vars);
	    $json = file_get_contents('php://input'); //$GLOBALS['HTTP_RAW_POST_DATA'] is not preferred: http://www.php.net/manual/en/ini.core.php#ini.always-populate-raw-post-data
	    $put_vars = CJSON::decode($json,true);  //true means use associative array
	    
	    $accountId = UserInformation::getAccountId();
            $locationId = UserInformation::getLocationId();				
							
            $ezApi = new EzRestApi();
				
            Yii::log($json);
	    switch($_GET['model'])
	    {
	        // Find respective model
	        case 'product':
				$product = $put_vars;			
                    
                                //echo $product["Image"];
                                
				$model = $ezApi->saveProduct($accountId, $locationId, $product['ProductId'],$product['ProductCode'],
				$product['ProductName'],$product['Price'], $product['DefaultProductCategoryId'], $product['DefaultProductUnitId'], $product['Description']);
	            $this->_sendResponse(200, CJSON::encode($model));    
	            break;
			case 'customer':
				$customer = $put_vars;
				$model = $ezApi->saveCustomer($accountId, $locationId, $customer['CustomerId'], $customer['CustomerCode'], $customer['CustomerFullName'],
						 $customer['CustomerCategoryId'], $customer['Phone'], $customer['Mobile'], $customer['Email'], $customer['Address'], $customer['Description']);
				
	            $this->_sendResponse(200, CJSON::encode($model));    
	            break;
	        default:
	            $this->_sendResponse(501, 
	                sprintf( 'Error: Mode <b>update</b> is not implemented for model <b>%s</b>',
	                $_GET['model']) );
	            Yii::app()->end();
	    }
	    // Did we find the requested model? If not, raise an error
	    if($model === null)
	        $this->_sendResponse(400, 
	                sprintf("Error: Didn't find any model <b>%s</b> with ID <b>%s</b>.",
	                $_GET['model'], $_GET['id']) );
	}


	

	
	
	public function getId()
	{
		if (isset($_GET["id"]))
		{
			return urldecode($_GET["id"]);
		}
		else {
			return 0;
		}
	}
	
	
	
	private function _sendResponse($status = 200, $body = '', $content_type = 'text/html')
	{
	    // set the status
	    $status_header = 'HTTP/1.1 ' . $status . ' ' . $this->_getStatusCodeMessage($status);
	    header($status_header);
	    // and the content type
	    header('Content-type: ' . $content_type);
	 
	    // pages with body are easy
	    if($body != '')
	    {
	        // send the body
	        echo $body;
	    }
	    // we need to create the body if none is passed
	    else
	    {
	        // create some body messages
	        $message = '';
	 
	        // this is purely optional, but makes the pages a little nicer to read
	        // for your users.  Since you won't likely send a lot of different status codes,
	        // this also shouldn't be too ponderous to maintain
	        switch($status)
	        {
	            case 401:
	                $message = 'You must be authorized to view this page.';
	                break;
	            case 404:
	                $message = 'The requested URL ' . $_SERVER['REQUEST_URI'] . ' was not found.';
	                break;
	            case 500:
	                $message = 'The server encountered an error processing your request.';
	                break;
	            case 501:
	                $message = 'The requested method is not implemented.';
	                break;
	        }
	 
	        // servers don't always have a signature turned on 
	        // (this is an apache directive "ServerSignature On")
	        $signature = ($_SERVER['SERVER_SIGNATURE'] == '') ? $_SERVER['SERVER_SOFTWARE'] . ' Server at ' . $_SERVER['SERVER_NAME'] . ' Port ' . $_SERVER['SERVER_PORT'] : $_SERVER['SERVER_SIGNATURE'];
	 
	        // this should be templated in a real-world solution
	        $body = '
				<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
				<html>
				<head>
				    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
				    <title>' . $status . ' ' . $this->_getStatusCodeMessage($status) . '</title>
				</head>
				<body>
				    <h1>' . $this->_getStatusCodeMessage($status) . '</h1>
				    <p>' . $message . '</p>
				    <hr />
				    <address>' . $signature . '</address>
				</body>
				</html>';
				 
	        echo $body;
	    }
	    Yii::app()->end();
	}

	private function _getStatusCodeMessage($status)
	{
	    // these could be stored in a .ini file and loaded
	    // via parse_ini_file()... however, this will suffice
	    // for an example
	    $codes = Array(
	        200 => 'OK',
	        400 => 'Bad Request',
	        401 => 'Unauthorized',
	        402 => 'Payment Required',
	        403 => 'Forbidden',
	        404 => 'Not Found',
	        500 => 'Internal Server Error',
	        501 => 'Not Implemented',
	    );
	    return (isset($codes[$status])) ? $codes[$status] : '';
	}

	private function _checkAuth()
	{
	    $userId = Yii::app()->user->getId();
		if ($userId)
		{
			
		}
		else {
			$this->_sendResponse(401, 'Error: Unauthorized');
		}
	}
 		
}